package org.farec.tcc.spring.controller;

import java.sql.Connection;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.farec.tcc.dao.AreaDAO;
import org.farec.tcc.dao.CategoriaDAO;
import org.farec.tcc.dao.FaqDAO;
import org.farec.tcc.dao.IncidenteDAO;
import org.farec.tcc.dao.OutrosDAO;
import org.farec.tcc.dao.PermissaoDAO;
import org.farec.tcc.dao.SolicitacaoDAO;
import org.farec.tcc.modelo.Ocorrencia;
import org.farec.tcc.modelo.Ocorrencia_Historico;
import org.farec.tcc.modelo.Permissao;
import org.farec.tcc.modelo.Usuario;
import org.farec.tcc.spring.adapter.Calendario;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class OutrosController {
		
	@RequestMapping("/listaOutros")
	public String lista(String[] status, Model model, HttpServletRequest request)
	{
		Connection connection = (Connection) request.getAttribute("conexao");
		
		HttpSession session = request.getSession();
		Usuario usuario = (Usuario) session.getAttribute("usuarioLogado");
		PermissaoDAO daoPermissao = new PermissaoDAO(connection);
		List<Permissao> permissaoList = daoPermissao.verificaPermissao(usuario,"item");
		List<Permissao> permissaoList2 = new ArrayList<>();
		
		for(Permissao p : permissaoList)
		{
			permissaoList2.add(daoPermissao.getPermissao("Outros", p));
			
		}
		
		if(permissaoList2.size() > 0 )
		{
			IncidenteDAO daoIncidente = new IncidenteDAO(connection);
			SolicitacaoDAO daoSolicitacao = new SolicitacaoDAO(connection);
			OutrosDAO daoOutros = new OutrosDAO(connection);		
						
			String[] status2 = {"Aberto","Andamento","Concluído"};
			Map<String,Boolean> statusMap = new HashMap<>();
			
			if(status != null)
			{
				for(String str : status2)
				{
					statusMap.put(str, false);
				}
				
				List<Ocorrencia> lista = daoOutros.getFiltro2(status);

				for(Ocorrencia ocorrencia : lista)
				{
					String key = ocorrencia.getStatus();
					statusMap.put(key,true);
				}
				
				session.setAttribute("qtdIncidenteAberto", daoIncidente.getQtdAberto(usuario));
				session.setAttribute("qtdSolicitacaoAberto", daoSolicitacao.getQtdAberto(usuario));
				session.setAttribute("qtdOutrosAberto", daoOutros.getQtdAberto(usuario));
				
				model.addAttribute("outros", daoOutros.getFiltro(status, usuario));
				model.addAttribute("statusMap", statusMap);
				return "outros";

			}
			
			for(String str : status2)
			{
				statusMap.put(str, true);
			}
			
			session.setAttribute("qtdIncidenteAberto", daoIncidente.getQtdAberto(usuario));
			session.setAttribute("qtdSolicitacaoAberto", daoSolicitacao.getQtdAberto(usuario));
			session.setAttribute("qtdOutrosAberto", daoOutros.getQtdAberto(usuario));
			
			model.addAttribute("outros", daoOutros.getLista(usuario));
			model.addAttribute("statusMap", statusMap);
			return "outros";
		}
		
		return "index";
		
	}
	
	
	//Metodos referentes ao historico da solicitacao
	
	@RequestMapping("/adicionaHistoricoOutros")
	public String adicionaHistorico(int codigoOutros, String descricaoOutros,  HttpServletRequest request) throws ParseException
	{
		Ocorrencia ocorrencia = new Ocorrencia();
		Ocorrencia_Historico historico = new Ocorrencia_Historico();
		
		//Montando o calendario e setando os valores das datas
		Calendar dataSolicitacao = null;
		Date data = new SimpleDateFormat("dd/MM/yyyy").parse(new Calendario().getDataAtual());
		dataSolicitacao = Calendar.getInstance();
		dataSolicitacao.setTime(data);
		historico.setDataHistorico(dataSolicitacao);
		
		//Setters  de Ocorrencia
		ocorrencia.setStatus("Andamento");
		
		//Setters do historico da ocorrencia
		historico.setCodigoOcorrencia(codigoOutros);
		historico.setDescricao(descricaoOutros);
			
		Connection connection = (Connection) request.getAttribute("conexao");
			
		OutrosDAO daoOutros = new OutrosDAO(connection);
		daoOutros.adicionaHistorico(ocorrencia, historico);
				
		return "redirect:exibeHistoricoOutros?id="+codigoOutros;
		
	}
	
	@RequestMapping("/exibeHistoricoOutros")
	public String mostraHistorico(int id, Model model, HttpServletRequest request) throws SQLException 
	{
		Connection connection = (Connection) request.getAttribute("conexao");
		
		OutrosDAO outrosDAO = new OutrosDAO(connection);
		
		model.addAttribute("historicoOutros", outrosDAO.getHistorico(id));
		model.addAttribute("outros2", outrosDAO.buscaPorCodigo(id));
			
		return "historicooutros";
	}
	
	@RequestMapping("/fecharOutros")
	public String finalizaOutros(int id, Model model, HttpServletRequest request)
	{		
		Connection connection = (Connection) request.getAttribute("conexao");
		
		OutrosDAO daoOutros = new OutrosDAO(connection);
		AreaDAO daoArea = new AreaDAO(connection);
		FaqDAO daoFaq = new FaqDAO(connection);
		
		model.addAttribute("outros2", daoOutros.buscaPorCodigo(id));
		model.addAttribute("areas", daoArea.getLista("nome"));
		model.addAttribute("faqs", daoFaq.getLista());
		
		return "fecharoutros";
	}
	
	@RequestMapping("/finalizarOutros")
	public String finalizar(int codigoOutros, String descricaoOutros, String status, String situacaoOutros, String area, String faq, HttpServletRequest request) throws ParseException
	{
		Ocorrencia ocorrencia = new Ocorrencia();
		Ocorrencia_Historico historico = new Ocorrencia_Historico();
		
		HttpSession session = request.getSession();
		
		Usuario usuario = (Usuario) session.getAttribute("usuarioLogado");
		
		//Montando o calendario e setando os valores das datas
		Calendar dataOutros = null;
		Date data = new SimpleDateFormat("dd/MM/yyyy").parse(new Calendario().getDataAtual());
		dataOutros = Calendar.getInstance();
		dataOutros.setTime(data);
		ocorrencia.setDataFechamento(dataOutros);
		historico.setDataHistorico(dataOutros);
		
		ocorrencia.setCodigo(codigoOutros);
		ocorrencia.setSituacao(situacaoOutros);
		ocorrencia.setArea(area);
		ocorrencia.setFaq(faq);
	
		//Setters do historico da ocorrencia
		historico.setDescricao(descricaoOutros);
	
		Connection connection = (Connection) request.getAttribute("conexao");
		
		IncidenteDAO daoIncidente = new IncidenteDAO(connection);
		SolicitacaoDAO daoSolicitacao = new SolicitacaoDAO(connection);
		OutrosDAO daoOutros = new OutrosDAO(connection);
		
		if(status.equals("Andamento")) //Executa se a situacao foi encaminhada
		{
			ocorrencia.setStatus("Concluído");
			daoOutros.fecharOutros(ocorrencia, historico, "Andamento");
			return "redirect:listaOutros?pagina=1";
		}
		
		else
			if(situacaoOutros.equals("reprovado"))
			{
				ocorrencia.setStatus("Concluído");
				daoOutros.fecharOutros(ocorrencia, historico, "Aberto");
				
				session.setAttribute("qtdIncidenteAberto", daoIncidente.getQtdAberto(usuario));
				session.setAttribute("qtdSolicitacaoAberto", daoSolicitacao.getQtdAberto(usuario));
				session.setAttribute("qtdOutrosAberto", daoOutros.getQtdAberto(usuario));
				
				return "redirect:listaOutros?pagina=1";
			}
		
		ocorrencia.setStatus("Andamento");
		daoOutros.analiseOutros(ocorrencia, historico);

		session.setAttribute("qtdIncidenteAberto", daoIncidente.getQtdAberto(usuario));
		session.setAttribute("qtdSolicitacaoAberto", daoSolicitacao.getQtdAberto(usuario));
		session.setAttribute("qtdOutrosAberto", daoOutros.getQtdAberto(usuario));
		
		return "redirect:listaOutros?pagina=1";

	}
	
	/*
	 * Metodos referentes ao controler de outros para interfaces de usuario que nao tem login e senha
	 */
	
	@RequestMapping("/abrir")
	public String formOutros(HttpServletRequest request, Model model)
	{
		Connection connection = (Connection) request.getAttribute("conexao");
		
		CategoriaDAO daoCategoria = new CategoriaDAO(connection);
		
		model.addAttribute("categorias", daoCategoria.getLista());
		
		return "cadoutros";
		
	}
	
	@RequestMapping("adicionaOutros")
	public String adiciona(Ocorrencia ocorrencia, HttpServletRequest request, Model model) throws Exception
	{
		Connection connection = (Connection) request.getAttribute("conexao");
		
		OutrosDAO daoOutros = new OutrosDAO(connection);
		
		String dataAbertura = new Calendario().getDataAtual();
		
		ocorrencia.setStatus("Aberto");
		ocorrencia.setPrioridade("Normal");
		ocorrencia.setDataAbertura(new Calendario().getData(dataAbertura));
		
		daoOutros.adiciona(ocorrencia);
		
		Map<String, Object> params = new LinkedHashMap<String, Object>(); 
		
		CategoriaDAO daoCategoria = new CategoriaDAO(connection);
		
		model.addAttribute("categorias", daoCategoria.getLista());
		
		ocorrencia.setAlerta(true);
		params.put("ocorrencia", ocorrencia);
				
		return "cadoutros";
	}

}
